home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 12 / 02 / textformate / wp_2_asc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  3.8 KB  |  185 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <libraries/dos.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6.  
  7. UBYTE AsciiKonvert[] = {
  8.   0x09, 0x09, /* Tabulator */
  9.   0x0a, 0x0a, /* LineFeed */
  10.   0x0c, 0x0c, /* FormFeed */
  11.   0x0d, ' ',  /* weichen Zeilenumbruch in Leerzeichen konvertieren*/
  12.   0xad, 0x00, /* WP-Trennung nicht ausführen */
  13.   0x8c, 0x0a, /* Seitenumbruch in LF */
  14.   0xa9, '-',  /* - übernehmen */
  15.   0xaa, '-',  /* - übernehmen */
  16.   0x00, 0x00
  17. };
  18.  
  19. FILE *DateiOut=NULL;
  20. FILE *DateiIn=NULL;
  21.  
  22. UBYTE Buffer[200];
  23.  
  24. void SkipChars( long c ) {
  25.   if( c < 0xc0 ) {
  26.     /*
  27.      * hierbei handelt es sich um ein Steuerzeichen, also keine
  28.      * Sequenz. Es reicht, das Zeichen zu überspringen.
  29.      */
  30.     return;
  31.   } else {
  32.     /*
  33.      * Es folgt eine Steuersequenz, die mit dem
  34.      * Zeichen c eingeführt wird, aber auch mit dem
  35.      * Zeichen c aufhört.
  36.      */
  37.     long newc;
  38.  
  39.     if( c == 0xcc || c == 0xe0 ) {
  40.       /*
  41.        * Einrückungen in Tabs umwandeln
  42.        */
  43.      putc(0x09, DateiOut);
  44.     }
  45.  
  46.     while( 1 ) {
  47.       newc= getc(DateiIn);
  48.       if( newc == c )
  49.         /*
  50.          * OK, die Sequenz wurde komplett gelesen.
  51.          */
  52.         return;
  53.     }
  54.  
  55.   }
  56. }
  57.  
  58. /*
  59.  * Überprüft das Zeichen auf die interen Liste zu konvertierender Zeichen
  60.  */
  61. char KonvertCharacter( long c ) {
  62.   long count=0;
  63.   UBYTE check=AsciiKonvert[count];
  64.   char ret=0;
  65.  
  66.   while( 1 ) {
  67.     if( check == (UBYTE)c ) {
  68.       /*
  69.        * OK, das Zeichen ist zu konvertieren
  70.        */
  71.       ret=1;
  72.       if( AsciiKonvert[count+1] != 0x0 ) {
  73.         if( putc(AsciiKonvert[count+1], DateiOut) == EOF) {
  74.           printf("Schreibfehler\n");
  75.           ret=-1;
  76.         }
  77.       }
  78.       break;
  79.     }
  80.     count+=2;
  81.     check=AsciiKonvert[count];
  82.     if( check == 0x0 )
  83.       break;
  84.   }
  85.  
  86.   return ret;
  87. }
  88.  
  89. void Scan_WPFile() {
  90.   long c;
  91.   char ret;
  92.  
  93.   while( (c = getc(DateiIn)) != EOF ) {
  94.  
  95.     if( c == 0xe1 ) { /* es folgt ein Sonderzeichen */ 
  96.       c=getc(DateiIn);
  97.       if( putc(c, DateiOut) == EOF) {
  98.         printf("Schreibfehler\n");
  99.         return;
  100.       }
  101.  
  102.       /*
  103.        * nächstes 0xe1 holen
  104.        */
  105.       c=getc(DateiIn);
  106.  
  107.     } else if( c >= ' ' && c <= '~' ) {
  108.       /*
  109.        * normales ASCII-Zeichen, also übernehmen
  110.        */
  111.       if( putc(c, DateiOut) == EOF) {
  112.         printf("Schreibfehler\n");
  113.         return;
  114.       }
  115.     } else if( (ret=KonvertCharacter(c)) == 0 ) {
  116.       /*
  117.        * Also muß es sich um ein Steuerzeichen
  118.        * handeln, daß nicht zu konvertieren ist
  119.        */
  120.       SkipChars( c );
  121.     } else if( ret == -1 ) {
  122.       /*
  123.        * Schreibfehler bei KonvertCharacter aufgetreten
  124.        */
  125.       return;
  126.     }
  127.   }
  128. }
  129.  
  130. BOOL Check_If_WPFile() {
  131.   /*
  132.    * Die ersten 2 Bytes lesen
  133.    */
  134.   long readbytes=fread(&Buffer[0],1,2,DateiIn);
  135.  
  136.   if( readbytes == 2 ) {
  137.     if( Buffer[0]==0x80 && Buffer[1] == 0x80 ) {
  138.       fseek(DateiIn,0,0);
  139.       return TRUE;
  140.     }
  141.   }
  142.   return FALSE;
  143. }
  144.  
  145. long main(long argc, char **argv) {
  146.   long error=0;
  147.  
  148.   if( argc == 3 ) {
  149.  
  150.     DateiIn=fopen(argv[1],"rb");
  151.  
  152.     if( DateiIn ) {
  153.       if( Check_If_WPFile() ) {
  154.         DateiOut=fopen(argv[2],"wb");
  155.         if( DateiOut ) {
  156.           Scan_WPFile();
  157.           fclose( DateiOut );
  158.         } else {
  159.           printf("Die Datei %s ließ sich nicht erzeugen!\n",argv[2]);
  160.           error=16;
  161.         }
  162.       } else {
  163.         error=15;
  164.         printf("Die Datei %s ist keine WordPerfect-Datei\n",argv[1]);
  165.       }
  166.       fclose( DateiIn );
  167.     } else {
  168.       error=10;
  169.       printf("Die Datei %s ließ sich nicht zum Lesen öffnen\n",argv[1]);
  170.     }
  171.  
  172.   } else if( argc ) {
  173.     /*
  174.      * OK, vom CLI gestartet, bloß die Anzahl der Argumente stimmt nicht
  175.      */
  176.     printf("\nGeschrieben von Rainer Zeitler\n"
  177.            "\nDieses Programm filtert den Text aus einer WordPerfect-Datei\n"
  178.            "und erzeugt eine ASCII-Datei!\n"
  179.            "Aufruf: %s <WP-Dateiname> <ASCII-Dateiname>\n\n",argv[0]);
  180.     error=5;
  181.   }
  182.  
  183.   exit( error );
  184. }
  185.